home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Programming / AmigaTalk / User / Quaternion.st < prev   
Text File  |  2000-05-08  |  5KB  |  195 lines

  1. " ------------------------------------------------------------- "
  2. " Quaternion.st - Implementation of Quaternions class for       "
  3. "                 AmigaTalk.                                    "
  4. " ------------------------------------------------------------- "
  5.  
  6. Class Quaternion :Magnitude
  7. ! s i j k !
  8. [
  9.   new
  10.     s <- Float new: 0.0.
  11.     i <- Float new: 0.0.
  12.     j <- Float new: 0.0.
  13.     k <- Float new: 0.0
  14. |
  15.   tensor
  16.     ^s
  17. |
  18.   ipart
  19.     ^i
  20. |
  21.   jpart
  22.     ^j
  23. |
  24.   kpart
  25.     ^k
  26. |
  27.   tensor: newReal
  28.     s <- newReal
  29. |
  30.   ipart: newI
  31.     i <- newI
  32. |
  33.   jpart: newJ
  34.     j <- newJ
  35. |
  36.   kpart: newK
  37.     k <- newK
  38. |
  39.   versor: ni p2: nj p3: nk
  40.     i <- ni.
  41.     j <- nj.
  42.     k <- nk
  43. |
  44.   coerce: aNumber ! newQuaternion !
  45.     newQuaternion <- Quaternion new.
  46.  
  47.     newQuaternion tensor: aNumber.
  48.     newQuaternion ipart:  0.0.
  49.     newQuaternion jpart:  0.0.
  50.     newQuaternion kpart:  0.0.
  51.  
  52.     ^ newQuaternion
  53. |
  54.   conjugate
  55.     i <- -1.0 * i.
  56.     j <- -1.0 * j.
  57.     k <- -1.0 * k.
  58.     ^ self
  59. |
  60.   ~
  61.     ^ conjugate self
  62. |
  63.   norm
  64.     ^ ((s * s) + (i * i) + (j * j) + (k * k))
  65. |
  66.   inverse
  67.     ((self norm) = 0.0)
  68.     ifTrue: [ <primitive 123 'Quaternion error: Division by zero!'>.
  69.               ^ nil
  70.             ].
  71.     
  72.     ^ ((self conjugate) / (self norm))
  73. |
  74.   + aNumber ! nc !
  75.  
  76.     (aNumber isKindOf: (self class))
  77.       ifFalse: [ nc <- self coerce: aNumber ]
  78.       ifTrue:  [ nc <- aNumber              ].
  79.  
  80.     s <- nc spart + self spart.
  81.     i <- nc ipart + self ipart.
  82.     j <- nc jpart + self jpart.
  83.     k <- nc kpart + self kpart.
  84.  
  85.     ^ self
  86. |
  87.   - aNumber ! nc !
  88.  
  89.     (aNumber isKindOf: (self class))
  90.       ifFalse: [ nc <- self coerce: aNumber ]
  91.       ifTrue:  [ nc <- aNumber              ].
  92.  
  93.     s <- self spart - nc spart.
  94.     i <- self ipart - nc ipart.
  95.     j <- self jpart - nc jpart.
  96.     k <- self kpart - nc kpart.
  97.  
  98.     ^ self
  99. |
  100.   * aNumber ! nc !
  101.  
  102.     (aNumber isKindOf: (self class))
  103.       ifFalse: [ nc <- self coerce: aNumber ]
  104.       ifTrue:  [ nc <- aNumber              ].
  105.  
  106.     s <- (s * nc spart) - (i * nc ipart) - (j * nc jpart) - (k * nc kpart).
  107.     i <- (i * nc spart) + (s * nc ipart) + (k * nc jpart) - (j * nc kpart).
  108.     j <- (j * nc spart) - (k * nc ipart) + (s * nc jpart) + (i * nc kpart).
  109.     k <- (k * nc spart) + (j * nc ipart) - (i * nc jpart) + (s * nc kpart).
  110.  
  111.     ^ self
  112. |
  113.   / aNumber ! nc denom r i !
  114.  
  115.     (aNumber isKindOf: (self class))
  116.       ifFalse: [ nc <- self coerce: aNumber ]
  117.       ifTrue:  [ nc <- aNumber              ].
  118.  
  119.     ((nc spart == 0.0) & (nc ipart == 0.0))
  120.       ifTrue: [ <primitive 123 'Quaternion error: Division by zero!'>.
  121.                 ^ nil 
  122.               ].
  123.     
  124.     self * (nc inverse).
  125.  
  126.     ^ self
  127. |
  128.   printString
  129.     ('{', <primitive 78 s>, ', ', <primitive 78 i>, ', ', <primitive 78 j>, ', ', <primitive 78 k>, '}') print.
  130.     ^ self
  131. |
  132.   == aNumber ! nc !
  133.  
  134.     (aNumber isKindOf: (self class))
  135.       ifFalse: [ nc <- self coerce: aNumber ]
  136.       ifTrue:  [ nc <- aNumber              ].
  137.  
  138.     ((s = nc spart) & (i = nc ipart) & (j = nc jpart) & (k = nc kpart))
  139.       ifTrue:  [ ^ true  ]
  140.       ifFalse: [ ^ false ]
  141. |
  142.   < aNumber ! nc !
  143.  
  144.     (aNumber isKindOf: (self class))
  145.       ifFalse: [ nc <- self coerce: aNumber ]
  146.       ifTrue:  [ nc <- aNumber              ].
  147.  
  148.     self computeMag.
  149.     nc   computeMag.
  150.     
  151.     ((s < nc spart) & (i < nc ipart) & (j < nc jpart) & (k < nc kpart))
  152.       ifTrue:  [ ^ true  ]
  153.       ifFalse: [ ^ false ]
  154. |
  155.   > aNumber ! nc !
  156.  
  157.     (aNumber isKindOf: (self class))
  158.       ifFalse: [ nc <- self coerce: aNumber ]
  159.       ifTrue:  [ nc <- aNumber              ].
  160.  
  161.     ((s > nc spart) & (i > nc ipart) & (j > nc jpart) & (k > nc kpart))
  162.       ifTrue:  [ ^ true  ]
  163.       ifFalse: [ ^ false ]
  164. |
  165.   <= aNumber ! nc !
  166.  
  167.     (aNumber isKindOf: (self class))
  168.       ifFalse: [ nc <- self coerce: aNumber ]
  169.       ifTrue:  [ nc <- aNumber              ].
  170.  
  171.     ((s <= nc spart) & (i <= nc ipart) & (j <= nc jpart) & (k <= nc kpart))
  172.       ifTrue:  [ ^ true  ]
  173.       ifFalse: [ ^ false ]
  174. |
  175.   >= aNumber ! nc !
  176.  
  177.     (aNumber isKindOf: (self class))
  178.       ifFalse: [ nc <- self coerce: aNumber ]
  179.       ifTrue:  [ nc <- aNumber              ].
  180.  
  181.     ((s >= nc spart) & (i >= nc ipart) & (j >= nc jpart) & (k >= nc kpart))
  182.       ifTrue:  [ ^ true  ]
  183.       ifFalse: [ ^ false ]
  184. |
  185.   ~= aNumber ! nc !
  186.  
  187.     (aNumber isKindOf: (self class))
  188.       ifFalse: [ nc <- self coerce: aNumber ]
  189.       ifTrue:  [ nc <- aNumber              ].
  190.  
  191.     ((s ~= nc spart) ! (i ~= nc ipart) ! (j ~= nc jpart) ! (k ~= nc kpart))
  192.       ifTrue:  [ ^ true  ]
  193.       ifFalse: [ ^ false ]
  194. ]
  195.